import Vue from 'vue';
import Vuex from 'vuex';
import ls from '../utils/localStorage';
import router from '../router';

// 引入actions.js的所有导出
import * as moreActions from './actions';
import * as moreGetters from './getters';

Vue.use(Vuex)

// 状态
const state = {
    user: ls.getItem('user'),
    // 保存当前用户的登录状态
    auth: ls.getItem('auth'),
    // 所有文章状态 
    articles: ls.getItem('articles'),
    // 搜索
    searchValue: '',
    origin: location.origin.indexOf('github.io') !== -1 ? `${location.origin}/vuejs-essential/dist/` : location.origin

}

// 提交
const mutations = {
    UPDATE_USER(state, user) {
        state.user = user
        ls.setItem('user', user)
    },
    // 更改当前用户的登录状态
    UPDATE_AUTH(state, auth) {
        state.auth = auth
        ls.setItem('auth', auth)
    },
    // 更改所有文章的事件类型
    UPDATE_ARTICLES(state, articles) {
        state.articles = articles
        ls.setItem('articles', articles)
    },

    // 更新搜索值的事件类型
    UPDATE_SEARCH_VALUE(state, searchValue) {
        state.searchValue = searchValue
    }

}

// 动作
const actions = {
    // 登录
    login({
        commit
    }, user) {
        if (user) commit('UPDATE_USER', user)
        commit('UPDATE_AUTH', true)
        // 跳转到根路由
        router.push('/')
    },

    // 退出
    logout({
        commit
    }) {
        commit('UPDATE_AUTH', false)
        router.push({
            name: 'Home',
            params: {
                logout: true
            }
        })
    },

    // 更新个人信息
    updateUser({
        state,
        commit
    }, user) {
        const stateUser = state.user

        if (stateUser && typeof stateUser === 'object') {
            // 解包对象，并将对象合并
            user = {
                ...stateUser,
                ...user
            }
        }
        commit('UPDATE_USER', user)
    },

    // 使用对象展开运算符混入moreActions
    ...moreActions
}

// getters
const getters = {
    getArticleById: (state, getters) => (id) => {
        // // 使用派生状态 computedArticles 作为所有文章
        let articles = getters.computedArticles

        if (Array.isArray(articles)) {
            // 过滤数据
            articles = articles.filter(article => parseInt(id) === parseInt(article.articleId))
            return articles.length ? articles[0] : null
        } else {
            return null
        }
    },

    // 混入 moreGetters, 意为 getters = Object.assign(getters, moreGetters)
    ...moreGetters
}


// 注册vuex模块，生成store实例
const store = new Vuex.Store({
    state,
    mutations,
    actions,
    getters
})

export default store